// memory management

// 申请
// let obj = {};

// 使用
// obj.name = 'lg';

// 释放
// obj = null;

// JavaScript

// JS中内存管理是自动的
// 对象不再被引用时是垃圾
// 对象不能从根上访问时是垃圾

// 可达对象：从根上能够被访问到的变量（引用、作用域链）

// JS的根可以理解我全局变量对象

function objGroup(obj1, obj2) {
  obj1.next = obj2;
  obj2.prev = obj1;
  return {
    o1: obj1,
    o2: obj2
  };
}

let obj = objGroup({ name: 'obj1' }, { name: 'obj2' });

console.log(obj);
// 引用计数（ARC）
/**
 * 引用计数器
 */
// 可以及时回收垃圾对象
// 减少程序卡顿时间
// 无法回收循环引用的对象
// 资源消耗比较大（引用计数器）
// 标记清除(GC)
// 可以回收循环引用的对象
// 容易产生碎片化空间，浪费空间
// 不会立即回收垃圾对象，开启GC线程，暂停程序
// 标记阶段(GC)
// 类似标记清除，减少碎片化空间
// 清除阶段
/**
 * 空间碎片化
 */
/**
 * 名词解释：
 * 在GC的世界里对象指的是通过应用程序利用的数据的集合。是GC的基本单位。一般由
 * 头(header)和域(field)构成
 * 活动对象：
 * 能通过引用程序引用的对象就被称为活动对象。（可以直接或间接从全局变量空间中引出的对象）
 * 非活动对象：
 * 不同通过程序引用的对象则称为非活动对象。（这就是被清除的目标）
 */

// 标记整理
// 标记清除的增强，标记阶段一致
// 清楚阶段会先执行整理，移动对象位置
// 分代回收

/**
 * V8
 * 主流的JavaScript引擎
 * 采用即时编译(JIT)
 * 内存设限（64 <= 1.5G 32 <= 800M）
 */
/**
 * 垃圾回收策略
 * 基础类型数据
 * 引用类型数据
 * 垃圾回收机制主要是针对堆内存里面的引用类型数据
 * 采用分代回收的思想
 * 内存分为新生代和老生代
 * 针对不同的对象采用不同的GC算法
 * 分代回收
 * 空间复制
 * 标记清除
 * 标记整理
 * 标记增量
 */
/**
 *
 */
